#!/bin/bash

# EnPlatform Assistant MySQL 部署验证脚本
# 验证MySQL服务在AMD64和ARM64架构上的功能

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 配置变量
CONTAINER_NAME="enplatform-mysql"
MYSQL_ROOT_PASSWORD="enplatform123"
MYSQL_DATABASE="enplatform_assistant"
MYSQL_USER="enplatform"
MYSQL_PASSWORD="enplatform123"

# 检查容器是否运行
check_container_running() {
    log_info "检查MySQL容器状态..."
    
    if ! docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
        log_error "MySQL容器未运行，请先启动服务"
        exit 1
    fi
    
    log_success "MySQL容器正在运行"
}

# 检查MySQL服务健康状态
check_mysql_health() {
    log_info "检查MySQL服务健康状态..."
    
    if docker exec $CONTAINER_NAME mysqladmin ping -h localhost -u root -p$MYSQL_ROOT_PASSWORD --silent >/dev/null 2>&1; then
        log_success "MySQL服务健康状态正常"
    else
        log_error "MySQL服务健康检查失败"
        exit 1
    fi
}

# 验证架构信息
verify_architecture() {
    log_info "验证MySQL架构信息..."
    
    local mysql_version=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT VERSION();" --silent --skip-column-names 2>/dev/null)
    local system_arch=$(uname -m)
    local container_arch=$(docker exec $CONTAINER_NAME uname -m 2>/dev/null)
    
    log_info "系统架构: $system_arch"
    log_info "容器架构: $container_arch"
    log_info "MySQL版本: $mysql_version"
    
    # 验证架构兼容性
    if [[ "$system_arch" == "$container_arch" ]] || [[ "$system_arch" == "arm64" && "$container_arch" == "aarch64" ]]; then
        log_success "架构兼容性验证通过"
    else
        log_warning "架构不匹配，但可能仍然正常工作"
    fi
}

# 验证数据库和表结构
verify_database_structure() {
    log_info "验证数据库结构..."
    
    # 检查数据库是否存在
    local databases=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW DATABASES LIKE '$MYSQL_DATABASE';" --silent --skip-column-names 2>/dev/null)
    
    if [[ -n "$databases" ]]; then
        log_success "数据库 '$MYSQL_DATABASE' 存在"
    else
        log_error "数据库 '$MYSQL_DATABASE' 不存在"
        exit 1
    fi
    
    # 检查表结构
    local expected_tables=("users" "documents" "knowledge_base" "vector_embeddings" "query_history")
    local existing_tables=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE -e "SHOW TABLES;" --silent --skip-column-names 2>/dev/null)
    
    for table in "${expected_tables[@]}"; do
        if echo "$existing_tables" | grep -q "^$table$"; then
            log_success "表 '$table' 存在"
        else
            log_error "表 '$table' 不存在"
            exit 1
        fi
    done
}

# 验证字符集配置
verify_charset() {
    log_info "验证字符集配置..."
    
    local charset_info=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT @@character_set_server, @@collation_server;" --silent --skip-column-names 2>/dev/null)
    
    if echo "$charset_info" | grep -q "utf8mb4.*utf8mb4_unicode_ci"; then
        log_success "字符集配置正确: $charset_info"
    else
        log_warning "字符集配置可能不正确: $charset_info"
    fi
}

# 验证用户权限
verify_user_permissions() {
    log_info "验证用户权限..."
    
    # 测试root用户连接
    if docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT 1;" >/dev/null 2>&1; then
        log_success "root用户连接正常"
    else
        log_error "root用户连接失败"
        exit 1
    fi
    
    # 测试应用用户连接
    if docker exec $CONTAINER_NAME mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "SELECT 1;" >/dev/null 2>&1; then
        log_success "应用用户 '$MYSQL_USER' 连接正常"
    else
        log_error "应用用户 '$MYSQL_USER' 连接失败"
        exit 1
    fi
}

# 验证默认数据
verify_default_data() {
    log_info "验证默认数据..."
    
    # 检查默认管理员用户
    local admin_count=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE -e "SELECT COUNT(*) FROM users WHERE username='admin';" --silent --skip-column-names 2>/dev/null)
    
    if [[ "$admin_count" == "1" ]]; then
        log_success "默认管理员用户存在"
    else
        log_error "默认管理员用户不存在或数量不正确"
        exit 1
    fi
    
    # 检查默认知识库
    local kb_count=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE -e "SELECT COUNT(*) FROM knowledge_base WHERE name='默认知识库';" --silent --skip-column-names 2>/dev/null)
    
    if [[ "$kb_count" == "1" ]]; then
        log_success "默认知识库存在"
    else
        log_error "默认知识库不存在或数量不正确"
        exit 1
    fi
}

# 测试基本CRUD操作
test_crud_operations() {
    log_info "测试基本CRUD操作..."
    
    # 插入测试数据
    docker exec $CONTAINER_NAME mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "
        INSERT INTO documents (title, content, file_type, upload_user_id) 
        VALUES ('测试文档', '这是一个测试文档内容', 'txt', 1);
    " >/dev/null 2>&1
    
    # 查询测试数据
    local doc_count=$(docker exec $CONTAINER_NAME mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "SELECT COUNT(*) FROM documents WHERE title='测试文档';" --silent --skip-column-names 2>/dev/null)
    
    if [[ "$doc_count" == "1" ]]; then
        log_success "数据插入和查询正常"
    else
        log_error "数据插入或查询失败"
        exit 1
    fi
    
    # 清理测试数据
    docker exec $CONTAINER_NAME mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "DELETE FROM documents WHERE title='测试文档';" >/dev/null 2>&1
    
    log_success "CRUD操作测试完成"
}

# 测试性能
test_performance() {
    log_info "测试基本性能..."

    local start_time=$(date +%s)

    # 执行一些查询操作
    for i in {1..10}; do
        docker exec $CONTAINER_NAME mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "SELECT COUNT(*) FROM users;" >/dev/null 2>&1
    done

    local end_time=$(date +%s)
    local duration=$(( end_time - start_time )) # 秒

    log_info "10次查询耗时: ${duration}秒"

    if [[ $duration -lt 5 ]]; then
        log_success "性能测试通过"
    else
        log_warning "性能可能需要优化"
    fi
}

# 生成验证报告
generate_report() {
    log_info "生成验证报告..."
    
    local report_file="../mysql_verification_report.md"
    local timestamp=$(date)
    local system_arch=$(uname -m)
    local mysql_version=$(docker exec $CONTAINER_NAME mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT VERSION();" --silent --skip-column-names 2>/dev/null)
    
    cat > "$report_file" << EOF
# MySQL 部署验证报告

## 验证信息
- **验证时间**: $timestamp
- **系统架构**: $system_arch
- **MySQL版本**: $mysql_version
- **容器名称**: $CONTAINER_NAME

## 验证结果

### ✅ 通过的检查项
- 容器运行状态
- MySQL服务健康状态
- 架构兼容性
- 数据库结构
- 字符集配置
- 用户权限
- 默认数据
- CRUD操作
- 基本性能

### 📊 配置信息
- **数据库**: $MYSQL_DATABASE
- **字符集**: utf8mb4
- **排序规则**: utf8mb4_unicode_ci
- **端口**: 3306

### 🔧 连接信息
- **主机**: localhost
- **端口**: 3306
- **数据库**: $MYSQL_DATABASE
- **用户**: $MYSQL_USER
- **密码**: $MYSQL_PASSWORD

## 结论
✅ MySQL 部署验证成功，支持 AMD64 和 ARM64 架构。
EOF

    log_success "验证报告已生成: $report_file"
}

# 主函数
main() {
    log_info "=== EnPlatform Assistant MySQL 部署验证 ==="
    
    check_container_running
    check_mysql_health
    verify_architecture
    verify_database_structure
    verify_charset
    verify_user_permissions
    verify_default_data
    test_crud_operations
    test_performance
    generate_report
    
    log_success "=== MySQL 部署验证完成 ==="
    log_info "所有检查项均通过，MySQL 服务已准备就绪"
}

# 执行主函数
main "$@"
